package Thread.demo7.CountDownLatch;

import java.util.concurrent.CountDownLatch;

/**
 * 例子： 其他员工走了，我才能走
 * 多线程的工具类CountDownLatch
 * 主要原理：通过count变量来控制等待，如果count值为0了(其他线程的任务都完成了)，那就可以继续执行。
 * 使用说明：
 *      count初始化CountDownLatch，然后需要等待的线程调用await方法。
 *      await方法会一直受阻塞直到count=0。而其它线程完成自己的操作后，
 *      调用countDown()使计数器count减1。当count减到0时，所有在等待的线程均会被释放
 *      说白了就是通过count变量来控制等待，如果count值为0了(其他线程的任务都完成了)，那就可以继续执行。
 * @author
 * @create 2018-10-10 12:24
 **/
public class CountDownLatchTest {

    public static void main(String[] args) {

        //输入的count为5，当执行了一次countdown一次，则count会减1
        CountDownLatch countDownLatch = new CountDownLatch(5);

        System.out.println("六点时间到，该下班了");

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    countDownLatch.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("其他员工走了，我才开始走");
            }
        }).start();

        for (int i = 0; i < 5; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("员工XX走了");
                    //则对应的count值会减1
                    countDownLatch.countDown();
                }
            }).start();
        }
    }
}
